package com.sxj.corejava.code08_常用类.String;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Arrays;

/**
 * @author 石小俊
 * @date 2024年04月11日 18:28
 */
public class Test07_字符集 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        garbled();
    }

    public static void showEncoding() {
        System.out.println("当前系统使用的字符集为:" + System.getProperty("file.encoding"));
        System.out.println("JVM默认使用的字符集:" + Charset.defaultCharset());
    }

    public static void encoder() throws UnsupportedEncodingException {
        String s = "你好";
        // 将字符串进行编码
        // 当没有参数时,表示使用默认字符集
        byte[] bytes = s.getBytes();
        // [-28, -67, -96, -27, -91, -67]
        System.out.println(Arrays.toString(bytes));

        // 使用指定字符集进行编码
        byte[] bytes2 = s.getBytes("GBK");
        // [-60, -29, -70, -61]
        System.out.println(Arrays.toString(bytes2));

        byte[] bytes3 = s.getBytes("ISO-8859-1");
        // [63, 63]
        System.out.println(Arrays.toString(bytes3));
    }

    public static void decoder() throws UnsupportedEncodingException {
        byte[] bs = {-28, -67, -96, -27, -91, -67};
        // 表示使用平台默认字符集将字节数组转换成一个字符串
        String s = new String(bs);
        System.out.println(s);

        byte[] bs2 = {-60, -29, -70, -61};
        // 表示使用指定字符集进行解码
        String s2 = new String(bs2, "GBK");
        System.out.println(s2);
    }

    public static void garbled() throws UnsupportedEncodingException {
        // 所谓乱码,就是编码与解码所使用的字符集不一致时会导致乱码
        String s = "你好";
        // 编码 --> 使用GBK编码
        byte[] bs = s.getBytes("GBK");
        System.out.println("使用GBK编码后的结果:" + Arrays.toString(bs));
        // 解码 --> 使用GBK解码
        String s2 = new String(bs, "GBK");
        // 解码 --> 使用UTF-8解码
        // s2 = new String(bs);
        // 解码 --> 使用ISO-8859-1解码
        s2 = new String(bs, "ISO-8859-1");
        System.out.println("使用ISO-8859-1解码后的结果:" + s2);

        // 乱码的解决方式
        // 如果遇到一个乱码数据,且我们知道其编码与解码所使用的字符集时
        // 可以通过逆推的方式进行解码
        // 先编码 --> 使用出现乱码的数据解码时所使用的字符集 --> UTF-8
        byte[] bytes = s2.getBytes("ISO-8859-1");
        // 再解码 --> 使用出现乱码的数据编码时所使用的字符集 --> GBK
        String s3 = new String(bytes, "GBK");
        System.out.println("解决乱码后的数据为:" + s3);

        // 简写方式
        String s4 = new String(s2.getBytes("ISO-8859-1"), "GBK");
        System.out.println("简写方式解决的结果:" + s4);

        // 此时发现有些场景解决成功,有些场景解决失败了
        // GBK不符合UTF-8的规则,这是出现乱码后无法解决
    }
}
